home *** CD-ROM | disk | FTP | other *** search
- /*
- * Moteur de reflexion v1.0
- *
- * 12-Mar-94
- *
- */
-
- #include "protos.h"
- #include "main.h"
-
- #include <stdio.h>
-
- #define QUATRE 31000
- #define BTROISTROIS 6000
- #define BTROISBTROIS 10000
- #define BTROIS 5000 /* on peut atteindre de suite pour JOU */
- #define TROISTROIS 2000
- #define TROIS 1000 /* on peut atteindre de suite pour ORD */
- #define RGAIN 10000
- #define GAIN 30000
- #define DEUXDEUX 200
- #define DEUX 100
-
- UBYTE CoupX[10];
- extern UBYTE prof_max;
- ptrtab terrain;
- ULONG Positions;
- UBYTE lignes[]={0,10,50,70,50,10,0};
-
- UBYTE TestTab(ptrtab pipo,char flag)
- {
- UBYTE i,j,k,i1,j1,i2,j2;
-
- i2=(XMAX+GAGNE+3)>>1;
- j2=(YMAX+GAGNE+2)>>1;
-
- for(j=GAGNE;j<pipo->colonnes[i2];j++)
- {
- if(pipo->jeu[i2][j]==flag)
- {
- k=1; /* Diagonal Haut */
- i1=i2+1;
- j1=j+1;
- while(pipo->jeu[i1][j1]==flag)
- {
- k++;
- i1++;
- j1++;
- }
- i1=i2-1;
- j1=j-1;
- while(pipo->jeu[i1][j1]==flag)
- {
- k++;
- i1--;
- j1--;
- }
- if(k>3)
- return(2);
- k=1; /* Diagonal Bas */
- i1=i2+1;
- j1=j-1;
- while(pipo->jeu[i1][j1]==flag)
- {
- k++;
- i1++;
- j1--;
- }
- i1=i2-1;
- j1=j+1;
- while(pipo->jeu[i1][j1]==flag)
- {
- k++;
- i1--;
- j1++;
- }
- if(k>3)
- return(3);
- k=1; /* Horizontal */
- i1=i2+1;
- while(pipo->jeu[i1][j]==flag)
- {
- k++;
- i1++;
- }
- i1=i2-1;
- while(pipo->jeu[i1][j]==flag)
- {
- k++;
- i1--;
- }
- if(k>3)
- return(1);
- }
- }
- for(i=GAGNE;i<GAGNE+XMAX;i++)
- {
- k=0; /* Vertical */
- j1=j2;
- while(pipo->jeu[i][j1]==flag)
- {
- k++;
- j1++;
- }
- if(k)
- {
- j1=j2-1;
- while(pipo->jeu[i][j1]==flag)
- {
- k++;
- j1--;
- }
- if(k>3)
- return(4);
- }
- }
- return(0);
- }
-
- /*
- * c : bit valeur signification
- *
- * 0 la figure est encerclée
- * 0 1 la case avant est vide
- * 1 2 " " + on peut l'atteindre de suite
- * 2 4 la seconde case avant est vide
- * 3 8 " " + on peut l'atteindre de suite
- * 4 16 la seconde case avant est occupée par un de nos pions
- *
- * 5 32 la case après est vide
- * 6 64 " " + on peut l'atteindre de suite
- * 7 128 la seconde case après est vide
- * 8 256 " " + on peut l'atteindre de suite
- * 9 512 la seconde case après est occupée par un de nos pions
- *
- */
-
- short evalue(UBYTE k,UWORD c)
- {
- short eval=0;
-
- if(k==2)
- {
- if(c&1)
- {
- if(c&32)
- if((c&528)==528) /* X.XX.X */
- if((c&66)==66)
- eval=(GAIN);
- else
- if(c&66)
- eval=(TROIS);
- else
- eval=(BTROIS);
- else
- if(c&512) /* .XX.X */
- if(c&66)
- eval=(TROIS);
- else
- eval=(BTROIS);
- else
- if(c&16) /* X.XX. */
- if(c&2)
- eval=(TROIS);
- else
- eval=(BTROIS);
- else
- if((c&132)==132) /* ..XX.. */
- if(((c&322)==322)||((c&74)==74))
- eval=(GAIN);
- else
- eval=(DEUXDEUX);
- else
- if(c&128) /* .XX.. */
- if((c&322)==322)
- eval=(GAIN);
- else
- eval=(DEUX);
- else
- if(c&4) /* ..XX. */
- if((c&74)==74)
- eval=(GAIN);
- else
- eval=(DEUX);
- else /* .XX. */
- eval=(DEUX);
- else
- if(c&4) /* ..XX */
- if((c&10)==10)
- eval=(DEUXDEUX);
- else
- eval=(DEUX);
- else
- if(c&16) /* X.XX */
- if(c&2)
- eval=(TROIS);
- else
- eval=(BTROIS);
- }
- else
- if((c&160)==160) /* XX.. */
- if((c&320)==320)
- eval=(DEUXDEUX);
- else
- eval=(DEUX);
- else
- if(c&512) /* XX.X */
- if(c&64)
- eval=(TROIS);
- else
- eval=(BTROIS);
- }
- else
- {
- if((c&33)==33) /* .XXX. */
- if((c&66)==66)
- eval=(GAIN);
- else
- if(c&66)
- eval=(BTROISTROIS);
- else
- eval=(BTROISBTROIS);
- else
- if(c&1) /* .XXX */
- if(c&2)
- eval=(TROIS);
- else
- eval=(BTROIS);
- else
- if(c&32) /* XXX. */
- if(c&64)
- eval=(TROIS);
- else
- eval=(BTROIS);
- }
- #ifdef DEB
- printf("k=%d c=%d val=%d\n",k,c,eval);
- #endif
- return(eval);
- }
-
- short evalue2(UBYTE k,UWORD c)
- {
- short eval=0;
-
- if(k==2)
- {
- if(c&1)
- {
- if(c&32)
- if((c&528)==528) /* X.XX.X */
- if((c&66)==66)
- eval=(GAIN);
- else
- if(c&66)
- eval=(BTROIS);
- else
- eval=(TROIS);
- else
- if(c&512) /* .XX.X */
- if(c&66)
- eval=(BTROIS);
- else
- eval=(TROIS);
- else
- if(c&16) /* X.XX. */
- if(c&2)
- eval=(BTROIS);
- else
- eval=(TROIS);
- else
- if((c&132)==132) /* ..XX.. */
- if(((c&322)==322)||((c&74)==74))
- eval=(RGAIN);
- else
- eval=(DEUXDEUX);
- else
- if(c&128) /* .XX.. */
- if((c&322)==322)
- eval=(RGAIN);
- else
- eval=(DEUX);
- else
- if(c&4) /* ..XX. */
- if((c&74)==74)
- eval=(RGAIN);
- else
- eval=(DEUX);
- else /* .XX. */
- eval=(DEUX);
- else
- if(c&4) /* ..XX */
- if((c&10)==10)
- eval=(DEUXDEUX);
- else
- eval=(DEUX);
- else
- if(c&16) /* X.XX */
- if(c&2)
- eval=(BTROIS);
- else
- eval=(TROIS);
- }
- else
- if((c&160)==160) /* XX.. */
- if((c&320)==320)
- eval=(DEUXDEUX);
- else
- eval=(DEUX);
- else
- if(c&512) /* XX.X */
- if(c&64)
- eval=(BTROIS);
- else
- eval=(TROIS);
- }
- else
- {
- if((c&33)==33) /* .XXX. */
- if((c&66)==66)
- eval=(GAIN);
- else
- if(c&66)
- eval=(BTROISTROIS);
- else
- eval=(TROISTROIS);
- else
- if(c&1) /* .XXX */
- if(c&2)
- eval=(BTROIS);
- else
- eval=(TROIS);
- else
- if(c&32) /* XXX. */
- if(c&64)
- eval=(BTROIS);
- else
- eval=(TROIS);
- }
- #ifdef DEB
- printf("k=%d c=%d val=%d\n",k,c,eval);
- #endif
- return(eval);
- }
-
- short EvalTab(ptrtab pipo)
- {
- ULONG i,j,k,i1,j1;
- ULONG c;
- short eval=0;
-
- for(j=GAGNE;j!=pipo->colonnes[XMAX+GAGNE-1];)
- {
- k=1;
- if(pipo->jeu[XMAX+GAGNE-1][j]==ORDINATEUR)
- {
- j++;
- while(pipo->jeu[XMAX+GAGNE-1][j]==ORDINATEUR)
- {
- k++;
- j++;
- }
- if(k>=GAGNE)
- return(QUATRE);
- if(pipo->jeu[XMAX+GAGNE-1][j]==RIEN)
- if(k==2)
- eval+=DEUX;
- else
- if(k==3)
- eval+=TROIS;
- }
- else
- {
- j++;
- while(pipo->jeu[XMAX+GAGNE-1][j]==JOUEUR)
- {
- k++;
- j++;
- }
- if(k>=GAGNE)
- return(-QUATRE);
- if(pipo->jeu[XMAX+GAGNE-1][j]==RIEN)
- if(k==2)
- eval-=DEUX;
- else
- if(k==3)
- eval-=TROIS;
- }
- }
- for(i=GAGNE;i!=XMAX+GAGNE-1;i++)
- for(j=GAGNE;j!=pipo->colonnes[i];j++)
- if(pipo->jeu[i][j]==ORDINATEUR)
- {
- eval+=lignes[i-GAGNE];
- if(pipo->jeu[i-1][j-1]!=ORDINATEUR)
- {
- k=1;
- i1=i+1;
- j1=j+1;
- while(pipo->jeu[i1][j1]==ORDINATEUR)
- {
- k++;
- j1++;
- i1++;
- }
- if(k>=GAGNE)
- return(QUATRE);
- else
- if(k>1)
- {
- #ifdef DEB
- printf("*Dh %d %d ",i-GAGNE+1,j-GAGNE+1);
- #endif
- c=0;
- if(pipo->jeu[i-1][j-1]==RIEN)
- {
- if(pipo->colonnes[i-1]==j-1)
- c=3;
- else
- c=1;
- if(pipo->jeu[i-2][j-2]==RIEN)
- if(pipo->colonnes[i-2]==j-2)
- c|=12;
- else
- c|=4;
- else
- if(pipo->jeu[i-2][j-2]==ORDINATEUR)
- c|=16;
- }
- if(pipo->jeu[i1][j1]==RIEN)
- {
- if(pipo->colonnes[i1]==j1)
- c|=96;
- else
- c|=32;
- if(pipo->jeu[i1+1][j1+1]==RIEN)
- if(pipo->colonnes[i1+1]==j1+1)
- c|=384;
- else
- c|=128;
- else
- if(pipo->jeu[i1+1][j1+1]==ORDINATEUR)
- c|=512;
- }
- if(c&99)
- eval+=evalue(k,c);
- }
- }
- if(pipo->jeu[i-1][j+1]!=ORDINATEUR)
- {
- k=1;
- i1=i+1;
- j1=j-1;
- while(pipo->jeu[i1][j1]==ORDINATEUR)
- {
- k++;
- j1--;
- i1++;
- }
- if(k>=GAGNE)
- return(QUATRE);
- else
- if(k>1)
- {
- #ifdef DEB
- printf("*Db %d %d ",i-GAGNE+1,j-GAGNE+1);
- #endif
- c=0;
- if(pipo->jeu[i-1][j+1]==RIEN)
- {
- if(pipo->colonnes[i-1]==j+1)
- c=3;
- else
- c=1;
- if(pipo->jeu[i-2][j+2]==RIEN)
- if(pipo->colonnes[i-2]==j+2)
- c|=12;
- else
- c|=4;
- else
- if(pipo->jeu[i-2][j+2]==ORDINATEUR)
- c|=16;
- }
- if(pipo->jeu[i1][j1]==RIEN)
- {
- if(pipo->colonnes[i1]==j1)
- c|=96;
- else
- c|=32;
- if(pipo->jeu[i1+1][j1-1]==RIEN)
- if(pipo->colonnes[i1+1]==j1-1)
- c|=384;
- else
- c|=128;
- else
- if(pipo->jeu[i1+1][j1-1]==ORDINATEUR)
- c|=512;
- }
- if(c&99)
- if(k==3)
- eval+=evalue(k,c);
- }
- }
- if(pipo->jeu[i-1][j]!=ORDINATEUR)
- {
- k=1;
- i1=i+1;
- while(pipo->jeu[i1][j]==ORDINATEUR)
- {
- k++;
- i1++;
- }
- if(k>=GAGNE)
- return(QUATRE);
- else
- if(k>1)
- {
- #ifdef DEB
- printf("*Hz %d %d ",i-GAGNE+1,j-GAGNE+1);
- #endif
- c=0;
- if(pipo->jeu[i-1][j]==RIEN)
- {
- if(pipo->colonnes[i-1]==j)
- c=3;
- else
- c=1;
- if(pipo->jeu[i-2][j]==RIEN)
- if(pipo->colonnes[i-2]==j)
- c|=12;
- else
- c|=4;
- else
- if(pipo->jeu[i-2][j]==ORDINATEUR)
- c|=16;
- }
- if(pipo->jeu[i1][j]==RIEN)
- {
- if(pipo->colonnes[i1]==j)
- c|=96;
- else
- c|=32;
- if(pipo->jeu[i1+1][j]==RIEN)
- if(pipo->colonnes[i1+1]==j)
- c|=384;
- else
- c|=128;
- else
- if(pipo->jeu[i1+1][j]==ORDINATEUR)
- c|=512;
- }
- if(c&99)
- eval+=evalue(k,c);
- }
- }
- k=1;
- j1=j+1;
- while(pipo->jeu[i][j1]==ORDINATEUR)
- {
- k++;
- j1++;
- }
- if(k>=GAGNE)
- return(QUATRE);
- else
- if(pipo->jeu[i][j1]==RIEN)
- if(k==2)
- eval+=DEUX;
- else
- if(k==3)
- eval+=TROIS;
- }
- else
- {
- eval-=lignes[i-GAGNE];
- if(pipo->jeu[i-1][j-1]!=JOUEUR)
- {
- k=1;
- i1=i+1;
- j1=j+1;
- while(pipo->jeu[i1][j1]==JOUEUR)
- {
- k++;
- j1++;
- i1++;
- }
- if(k>1)
- {
- #ifdef DEB
- printf("Dh %d %d ",i-GAGNE+1,j-GAGNE+1);
- #endif
- if(k>=GAGNE)
- return(-QUATRE);
- c=0;
- if(pipo->jeu[i-1][j-1]==RIEN)
- {
- if(pipo->colonnes[i-1]==j-1)
- c=3;
- else
- c=1;
- if(pipo->jeu[i-2][j-2]==RIEN)
- if(pipo->colonnes[i-2]==j-2)
- c|=12;
- else
- c|=4;
- else
- if(pipo->jeu[i-2][j-2]==JOUEUR)
- c|=16;
- }
- if(pipo->jeu[i1][j1]==RIEN)
- {
- if(pipo->colonnes[i1]==j1)
- c|=96;
- else
- c|=32;
- if(pipo->jeu[i1+1][j1+1]==RIEN)
- if(pipo->colonnes[i1+1]==j1+1)
- c|=384;
- else
- c|=128;
- else
- if(pipo->jeu[i1+1][j1+1]==JOUEUR)
- c|=512;
- }
- if(c&99)
- eval-=evalue2(k,c);
- }
- }
- if(pipo->jeu[i-1][j+1]!=JOUEUR)
- {
- k=1;
- i1=i+1;
- j1=j-1;
- while(pipo->jeu[i1][j1]==JOUEUR)
- {
- k++;
- j1--;
- i1++;
- }
- if(k>1)
- {
- #ifdef DEB
- printf("Db %d %d ",i-GAGNE+1,j-GAGNE+1);
- #endif
- if(k>=GAGNE)
- return(-QUATRE);
- c=0;
- if(pipo->jeu[i-1][j+1]==RIEN)
- {
- if(pipo->colonnes[i-1]==j+1)
- c=3;
- else
- c=1;
- if(pipo->jeu[i-2][j+2]==RIEN)
- if(pipo->colonnes[i-2]==j+2)
- c|=12;
- else
- c|=4;
- else
- if(pipo->jeu[i-2][j+2]==JOUEUR)
- c|=16;
- }
- if(pipo->jeu[i1][j1]==RIEN)
- {
- if(pipo->colonnes[i1]==j1)
- c|=96;
- else
- c|=32;
- if(pipo->jeu[i1+1][j1-1]==RIEN)
- if(pipo->colonnes[i1+1]==j1-1)
- c|=384;
- else
- c|=128;
- else
- if(pipo->jeu[i1+1][j1-1]==JOUEUR)
- c|=512;
- }
- if(c&99)
- eval-=evalue2(k,c);
- }
- }
- if(pipo->jeu[i-1][j]!=JOUEUR)
- {
- k=1;
- i1=i+1;
- while(pipo->jeu[i1][j]==JOUEUR)
- {
- k++;
- i1++;
- }
- if(k>1)
- {
- #ifdef DEB
- printf("Hz %d %d ",i-GAGNE+1,j-GAGNE+1);
- #endif
- c=0;
- if(k>=GAGNE)
- return(-QUATRE);
- if(pipo->jeu[i-1][j]==RIEN)
- {
- if(pipo->colonnes[i-1]==j)
- c=3;
- else
- c=1;
- if(pipo->jeu[i-2][j]==RIEN)
- if(pipo->colonnes[i-2]==j)
- c|=12;
- else
- c|=4;
- else
- if(pipo->jeu[i-2][j]==JOUEUR)
- c|=16;
- }
- if(pipo->jeu[i1][j]==RIEN)
- {
- if(pipo->colonnes[i1]==j)
- c|=96;
- else
- c|=32;
- if(pipo->jeu[i1+1][j]==RIEN)
- if(pipo->colonnes[i1+1]==j)
- c|=384;
- else
- c|=128;
- else
- if(pipo->jeu[i1+1][j]==JOUEUR)
- c|=512;
- }
- if(c&99)
- eval-=evalue2(k,c);
- }
- }
- k=1;
- j1=j+1;
- while(pipo->jeu[i][j1]==JOUEUR)
- {
- k++;
- j1++;
- }
- if(k>=GAGNE)
- return(-QUATRE);
- if(pipo->jeu[i][j1]==RIEN)
- if(k==2)
- eval-=DEUX;
- else
- if(k==3)
- eval-=TROIS;
- }
- return(eval);
- }
-
- short GenCoups(short valeur)
- {
- UBYTE i,k,coup=PIPO;
- short local,tmp;
- static char prof=1,mode=-1,flag=ORDINATEUR;
-
- if(mode)
- local=-INFINI;
- else
- local=INFINI;
- for(i=GAGNE;i!=XMAX+GAGNE;i++)
- {
- if(GereEvenementsLight())
- return(QUIT);
- k=terrain->colonnes[i];
- if(k!=YMAX+GAGNE)
- {
- terrain->jeu[i][k]=flag;
- terrain->colonnes[i]++;
- #ifdef DEB
- printf("Profondeur %d Coup %d ",prof,i-GAGNE+1);
- #endif
- if(prof!=prof_max)
- if(TestTab(terrain,flag))
- if(mode)
- tmp=VICTOIRE-prof;
- else
- tmp=prof-VICTOIRE;
- else
- {
- prof++;
- mode=~mode;
- flag=~flag;
- tmp=GenCoups(local);
- flag=~flag;
- mode=~mode;
- prof--;
- }
- else
- {
- Positions++;
- #ifdef DEB
- AffTab(terrain);
- #endif
- tmp=EvalTab(terrain);
- #ifdef DEB
- printf("\n%d\n",tmp);
- #endif
- if(mode)
- {
- if(tmp==QUATRE)
- tmp=VICTOIRE-prof;
- }
- else
- if(tmp==-QUATRE)
- tmp=prof-VICTOIRE;
- }
- terrain->jeu[i][--terrain->colonnes[i]]=RIEN;
- if(tmp==QUIT)
- return(QUIT);
-
- if(mode)
- {
- if(tmp>valeur)
- if(valeur!=-INFINI)
- return(tmp);
- if(tmp>=local)
- {
- local=tmp;
- coup=i;
- }
- }
- else
- {
- if(tmp<valeur)
- if(valeur!=-INFINI)
- return(tmp);
- if(tmp<=local)
- {
- local=tmp;
- coup=i;
- }
- }
- }
- }
- CoupX[prof]=coup;
- if(coup==PIPO)
- {
- Positions++;
- if(mode)
- {
- if(valeur<0)
- if(valeur!=-INFINI)
- return(0);
- if(local<=0)
- local=0;
- }
- else
- {
- if(valeur>0)
- if(valeur!=INFINI)
- return(0);
- if(local>=0)
- local=0;
- }
- }
- return(local);
- }
-